package com.nowcoder.topic.string.middle;

import java.util.ArrayList;
import java.util.Arrays;

/**
 * NC387 找到字符串中的异位词
 * @author d3y1
 */
public class NC387{
    /**
     * 代码中的类名、方法名、参数名已经指定，请勿修改，直接返回方法规定的值即可
     *
     *
     * @param s string字符串
     * @param p string字符串
     * @return int整型一维数组
     */
    public ArrayList findWord (String s, String p) {
//        return solution1(s, p);
        return solution2(s, p);
    }

    /**
     * 滑动窗口
     * @param s
     * @param p
     * @return
     */
    private ArrayList solution1(String s, String p){
        ArrayList<Integer> list = new ArrayList<>();
        char[] pArr = p.toCharArray();
        Arrays.sort(pArr);
        String pStr = String.valueOf(pArr);

        int len = s.length();
        int gap = pArr.length;
        char[] subArr;
        String subStr;
        for(int i=0; i+gap<=len; i++){
            subArr = s.substring(i, i+gap).toCharArray();
            Arrays.sort(subArr);
            subStr = String.valueOf(subArr);
            // 匹配
            if(subStr.equals(pStr)){
                list.add(i);
            }
        }

        return list;
    }

    /**
     * 双指针
     * @param s
     * @param p
     * @return
     */
    private ArrayList solution2(String s, String p){
        ArrayList<Integer> list = new ArrayList<>();

        // 字符串s 统计字符个数
        int[] sCount = new int[26];
        // 字符串p 统计字符个数
        int[] pCount = new int[26];
        for(char ch: p.toCharArray()){
            pCount[ch-'a']++;
        }

        // 双指针
        for(int left=0,right=0; right<s.length(); right++){
            sCount[s.charAt(right)-'a']++;
            while(sCount[s.charAt(right)-'a'] > pCount[s.charAt(right)-'a']){
                sCount[s.charAt(left)-'a']--;
                left++;
            }
            if(right-left+1 == p.length()){
                list.add(left);
            }
        }

        return list;
    }
}